package com.entities.usergroup.list;

import java.util.ArrayList;
import java.util.List;

import com.core.protocols.ICustomDatasourceDelegate;
import com.core.protocols.IServiceLayerDelegate;
import com.core.protocols.ITableViewDatasource;
import com.core.protocols.ITableViewDelegate;
import com.core.ui.controller.base.CustomController;
import com.core.ui.customcell.TableViewCell;
import com.core.ui.customcell.TableViewDataCell;
import com.core.ui.customview.TableViewHeaderCell;
import com.core.utils.GlobalConstants;
import com.core.utils.HTMLTagUtils;
import com.core.utils.IndexPath;
import com.core.utils.LocalizableString;
import com.entities.usergroup.servicelayer.UserGroupListLayer;
import com.model.KeyValue;
import com.model.user.UserGroup;

public class UserGroupListController
        extends CustomController
        implements ITableViewDatasource, ITableViewDelegate, IServiceLayerDelegate {

	ArrayList <UserGroup>             groupList      = null;

	private ICustomDatasourceDelegate delegate       = null;



	UserGroupListLayer                groupListLayer = null;

	private String                    selectedPage   = null;



	public String getSelectedPage () {

		return selectedPage;
	}



	/**
	 * ICustomDatasource
	 * 
	 * 
	 */

	@Override
	public void reloadData () {

		groupListLayer = new UserGroupListLayer();
		groupListLayer.setLayerDelegate(this);
		groupListLayer.performRequestWithFilter(null, null);

	}



	@Override
	public void setCustomDatasourceDelegate ( ICustomDatasourceDelegate delegate ) {

		this.delegate = delegate;

	}



	/**
     *
     *
     *
     *
     */


	public void setSelectedPage ( String selectedPage ) {

		this.selectedPage = selectedPage;
	}



	@Override
	public String tableStyleClassName () {

		return null;
	}



	@Override
	public String headerRowStyleClassNameAtIndex ( int index ) {

		return null;
	}



	@Override
	public String headerCellStyleClassNameAtIndexPath ( IndexPath indexPath ) {

		return null;
	}



	@Override
	public String cellStyleClassNameAtIndexPath ( IndexPath indexPath ) {

		return null;
	}



	@Override
	public String rowStyleClassNameAtIndex ( int index ) {

		return null;
	}



	@Override
	public int numberOfHeadRows () {

		return 1;
	}



	@Override
	public int numberOfHeadCols () {

		return 3;
	}



	@Override
	public TableViewHeaderCell headCellAtIndexPath ( IndexPath indexPath ) {

		LocalizableString localizableString = LocalizableString.sharedInstance();

		TableViewHeaderCell result = new TableViewHeaderCell();
		result.setStyleName("headerCellSimple");
		switch ( indexPath.getCol() ) {
			case 0: {
				result.setText("#");
				break;
			}
			case 1: {
				result.setText(localizableString.localizable("entity.User.field.name"));
				break;
			}
			case 2: {
				result.setText(localizableString.localizable("grid.column.operation"));
				break;
			}

			default:
				break;
		}
		return result;
	}



	@Override
	public int numberOfDataRows () {

		return groupList.size();
	}



	@Override
	public int numberOfDataCols () {

		return this.numberOfHeadCols();
	}



	@Override
	public TableViewCell dataCellAtIndexPath ( IndexPath indexPath ) {

		LocalizableString localizableString = LocalizableString.sharedInstance();

		UserGroup item = groupList.get(indexPath.getRow());
		TableViewDataCell result = new TableViewDataCell();
		switch ( indexPath.getCol() ) {
			case 0: {
				result.setStyleName("dataCellSimple");
				result.setText(String.format("%d", 1 + indexPath.getRow()));
				break;
			}
			case 1: {
				result.setStyleName("dataCellSimple maxwidth");
				result.setText(item.getName());
				result.setOnCellClick("%s?%s", GlobalConstants.SERVLET_GROUPINFO, item.idValue().toString());
				break;
			}
			case 2: {
				String idStrValue = item.idValue().getValue();
				result.setStyleName("dataCellSimple");
				String link = String.format("%s?%s", GlobalConstants.SERVLET_GROUPUPDATE, item.idValue().toString());
				ArrayList <KeyValue> attrs = new ArrayList <KeyValue>();
				attrs.add(new KeyValue("href", link, true));
				attrs.add(new KeyValue("class", "trigger_lnk", true));
				String editText = HTMLTagUtils.customTag("a", attrs, localizableString.localizable("object.operation.edit"));

				String ajax = String.format("javascript:deleteGroup(%s);", idStrValue);
				link = "javascript:void(0);";

				attrs = new ArrayList <KeyValue>();
				attrs.add(new KeyValue("href", link, true));
				attrs.add(new KeyValue("class", "trigger_lnk", true));
				attrs.add(new KeyValue("onclick", ajax, true));
				String deleteText = HTMLTagUtils.customTag("a", attrs, localizableString.localizable("object.operation.delete"));

				result.setText(String.format("%s|%s", editText, deleteText));
				break;

			}
			default: {
				break;
			}
		}
		return result;
	}



	@Override
	public <T> void responseResponseItemsList ( final List <T> items,
	                                            final Object request,
	                                            final Exception exception ) {

		groupList = new ArrayList <UserGroup>();

		if ( exception != null ) {
			return;
		}

		if ( items == null ) {
			return;
		}

		for ( T item : items ) {
			groupList.add((UserGroup) item);
		}

		if ( delegate != null ) {
			delegate.refreshContent();
		}
	}

}
